package pzc.lang;

/**
 * 二进制操作工具类.
 * 
 * <pre>
 * 不依赖于任何第三方包
 * </pre>
 * 
 * @author 彭
 * @version 1.0.0 2009/08/24
 */
public class BinaryUtils {

	/**
	 * byte数组到16进制(Hex)字符串的转换.
	 * 
	 * @param prefix
	 * @param b
	 * @return
	 */
	public static String bytes2HexString(String prefix, byte[] b) {
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < b.length; i++) {
			result.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));
		}
		return prefix + result.toString().toUpperCase();
	}

	/**
	 * byte数组到16进制(Hex)字符串的转换.
	 * <pre>
	 * 默认前缀是0x
	 * </pre>
	 * 
	 * @param b
	 * @return
	 */
	public static String bytes2HexString(byte[] b) {
		return bytes2HexString("0x", b);
	}

	/**
	 * 16进制(Hex)字符串到byte数组的转换.
	 * <pre>
	 * 其中16进制字符串不包含前缀
	 * </pre>
	 * 
	 * @param hexStr
	 * @return
	 */
	public static byte[] hexString2bytes(String hexStr) {
		StringBuilder sb = new StringBuilder(hexStr);
		byte[] ret = new byte[sb.length() / 2];
		int count = -1;
		for (int i = 0; i < sb.length();) {
			String strByte = sb.substring(i, i + 2);

			count++;
			ret[count] = (byte) Integer.parseInt(strByte, 16);

			i += 2;
		}

		return ret;
	}

	/**
	 * b2iu是一个把byte按照不考虑正负号的原则的＂升位＂函数，因为java没有unsigned运算 byte 2 unsigned int
	 */
	public static int b2iu(byte b) {
		return b < 0 ? b & 0x7F + 128 : b;
	}
	// public static byte iu2b(int b) {
	// // -128 - 127
	// // return (byte)b; -> OK
	// return (byte)(b > 127 ? b & 0xFF : b);
	// }
}
